#ifndef TAIIC_SENSOR_H
#define TAIIC_SENSOR_H

#include "taiic_rknn.h"
#include "rknn_api.h"
#include "rk_debug.h"
#include "rk_defines.h"
#include "rk_common.h"
#include "rk_comm_rgn.h"
#include "rk_comm_vi.h"
#include "rk_comm_vo.h"
#include "rk_comm_ivs.h"
#include "rk_comm_video.h"

#include "rk_mpi_vi.h"
#include "rk_mpi_adec.h"

#include "rk_mpi_mb.h"
#include "rk_mpi_sys.h"
#include "rk_mpi_venc.h"
#include "rk_mpi_vpss.h"
#include "rk_mpi_vo.h"
#include "rk_mpi_rgn.h"
#include "rk_mpi_cal.h"
#include "rk_mpi_ivs.h"

#include "test_common.h"
#include "test_comm_utils.h"
#include "test_comm_argparse.h"
#include "test_comm_bmp.h"


#include <pthread.h>

#include "isp/rkisp_demo.h"

#define CAPTURE_RAW_PATH "/data"
#define CAPTURE_CNT_FILENAME ".capture_cnt"
#define DEFAULT_CAPTURE_RAW_PATH "/data/capture_image"



#define BATTERYTIME 60
#define SKIP_ISP_FRAMES 3


#define LIPSPATH "/data/lips"
#define LOGPATH "/data/log.txt"


#ifdef __cplusplus
extern "C"
{
#endif

    typedef struct rkRGN_CFG_S
    {
        RGN_ATTR_S stRgnAttr;        // 定义区域属性结构体 区域类型 区域属性
        RGN_CHN_ATTR_S stRgnChnAttr; // 马赛克区域的通道显示属性 区域是否显示 区域类型 通道显示属性
    } RGN_CFG_S;

    typedef enum taiicPCM_TRANS
    {
        PCM_8_TO_16 = 0,
        PCM_16_TO_8 = 1,
    }TEST_PCM_TRANS;

    typedef struct _rkMpiVICtx
    {
        RK_S32 width;     // 图像的宽
        RK_S32 height;    // 图像的高
        RK_S32 devId;     // 设备号
        RK_S32 pipeId;    // 该 VI Dev 绑定的 PIPE 号
        RK_S32 channelId; // 通道号

        RK_S32 loopCountSet; // 循环次数
        RK_S32 selectFd;

        RK_BOOL bFreeze; // 是否使能视频输出冻结功能,VI模块输出的YUV画面保持不变，输出帧率等同于sensor输出帧率
        RK_S32 rgnType;
        RK_BOOL bMirror;    // 定义 VI 通道属性，镜像使能开关
        RK_BOOL bFlip;      // 定义 VI 通道属性，反转使能开关
        MB_POOL attachPool; // 有效的缓存池 ID 号

        COMPRESS_MODE_E enCompressMode; // 定义数据压缩格式结构体, 无压缩 AFBC压缩 无
        VI_DEV_ATTR_S stDevAttr;        // 定义VI设备属性结构体 暂未使用
        VI_DEV_BIND_PIPE_S stBindPipe;  // 定义 VI DEV 与 PIPE 的绑定关系, 与devID一致即可
        VI_CHN_ATTR_S stChnAttr;        // 定义 VI 通道属性 获取图像宽高 像素格式 动态范围 视频数据格式 压缩格式 镜像使能
                                 // 反转使能 队列深度 帧率控制 图像内存申请类型 获取图像为isp/直通数据的参数

        VI_SAVE_FILE_INFO_S stDebugFile; // VI通道数据保存信息结构体 是否保存 保存录路径 文件名 文件大小
        VIDEO_FRAME_INFO_S stViFrame;    // 视频帧信息结构体 输出图像buffer结构体 宽度 高度 虚宽 虚高 枕场模式 图像像素格式 视频像素格式
                                      //  视频压缩格式 动态范围 色域范围 图像虚拟地址 图像帧序列号 时间戳 私有数据 当前帧标记
        VI_CHN_STATUS_S stChnStatus; // VI通道状态结构体 当前通道是否使能 输出帧率 丢失帧率 获取失败次数 图像大小

        const char *aEntityName;     // 通道设备名字，无赋值是默认chn0_out
        VI_CHN_BUF_WRAP_S stChnWrap; // 定义VI通道buffer的卷绕属性 卷绕开关 buffer行高 buffer大小
                                     //  for vi
        RGN_CFG_S stViRgn; //
        bool isEnable;     // 是否使能
    } TAIIC_VI_CTX_S;

    // vi数据回调
    typedef void(tViFrameDataCallback)(void *data, RK_U32 wcount);
    //ai_vi数据回调
    typedef void(tAiViFrameDataCallback)(int vi,int ai);

    //开启vi数据的回调
    int taiic_vi_frame_data_callback(tViFrameDataCallback vi_frame_data);
    //开启ai_vi数据的回调
    void aivi_save_end_callback(tAiViFrameDataCallback aivi_save_end);

    // 配置 vi获取相关配置参数
    int taiic_vi_media_config_init(TAIIC_VI_CTX_S *ctx);
    // 初始化 vi
    RK_S32 taiic_vi_init(TAIIC_VI_CTX_S *ctx);
    // 开灯、开启相机、采集vi数据
    RK_S32 taiic_vi_get_release_frame_loop(TAIIC_VI_CTX_S *ctx);

    // 更新vi推理数据
    int taiic_vi_rknn_input_refresh(TOOLKIT_MODEL_CTX_S *ctx, RK_U8 *input_ptr);
     //isp related
    void process_image(void *p, int sequence, int size, demo_context_t *ctx,int flg);
    /*------------------------------------------------------------------------------------*/
    AUDIO_BIT_WIDTH_E find_bit_width(RK_S32 bit);
   
    RK_VOID test_bcd_callback();
    int ResamplePcm(short *pInAudioData, RK_U32 nInAudioLen, short *pOutAudioData, int &nOutAudioLen, TEST_PCM_TRANS method_n);

#ifdef __cplusplus
}
#endif

#endif